package ru.susu.algebra.field.quadratic;

import java.math.BigInteger;

import ru.susu.algebra.ui.formatters.IFormatter;

/**
 * Создает строковое представление основной единицы квадратичного поля.
 *
 * @author akargapolov
 * @since: 18.04.2010
 */
public class GeneralUnitFormatter implements IFormatter<QuadraticInteger>
{
	private IFormatter<BigInteger> _intFormatter = null;

	public GeneralUnitFormatter()
	{
	}

	public GeneralUnitFormatter(IFormatter<BigInteger> intFormatter)
	{
		_intFormatter = intFormatter;
	}

	/**
	 * {@inheritDoc}}
	 */
	@Override
	public String format(QuadraticInteger value)
	{
		StringBuffer result = new StringBuffer();
		BigInteger a = value.getA();
		BigInteger b = value.getB();
		BigInteger d = value.getD();
		int mod4 = d.mod(BigInteger.valueOf(4)).intValue();
		String w;
		if (mod4 == 1)
		{
			w = new StringBuffer().append("(1 + sqrt(").append(d).append(")) / 2").toString();
		}
		else
		{
			w = new StringBuffer().append("sqrt(").append(d).append(")").toString();
		}

		boolean aIsZero = a.compareTo(BigInteger.ZERO) == 0;
		if (!aIsZero)
			result.append(formatBigInteger(a));
		if (b.compareTo(BigInteger.ZERO) >= 0)
		{
			if (!aIsZero)
				result.append(" + ");
		}
		else
			result.append(" - ");

		if (!b.abs().equals(BigInteger.ONE))
			result.append(formatBigInteger(b.abs()));

		result.append("w, w = ").append(w);
		return result.toString();
	}

	/**
	 * Форматирует коэффициенты с помощью заданного через конструктор форматтера
	 * @param value целое число
	 * @return строкое представление числа
	 */
	protected String formatBigInteger(BigInteger value)
	{
		if (_intFormatter == null)
		{
			return value.toString();
		}
		return _intFormatter.format(value);
	}

}
